package com;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.io.FileInputStream;
import java.util.List;

/**
 * 使用DOM4j解析XML文档
 * DOM(Document Object Model)文档对象模型
 * DOM解析模式为先将xml文档按照其标签包含的结构转换为一个树状结构数据
 * 使得我们在获取xml文档内容改为遍历树结构完成
 */
public class ParaseXmlDemo {
    public static void main(String[] args) {
        /**
         * 解析xml的大致步骤：
         * 1：创建SAXReader
         * 2：使用SAXReader读取xml文档并产生Document对象
         * 这一步的作用就是DOM解析模式中先将xml文档读取并构建整棵
         * 树的结构的过程
         * 3：通过Document对象获取根元素（就是xml中的根标签内容）
         * 4：从根元素开始逐级获取子元素，以达到解析xml文档内容的目的
         */

        //2
        try {
            //1
            SAXReader reader = new SAXReader();
           Document doc= reader.read("./emplist.xml");
//            Document doc =reader.read(new File("./emplist.xml"));
//            Document doc =reader.read(new FileInputStream("./emplist.xml"));
            /**
             * Document对象提供了获取根元素的方法
             * Element getRootElement（）
             * Element的每一个实例用于表示xml文档上的一个元素（一对标签）
             * 其提供了获取xml元素信息的相关方法，常用的有：
             * String getName（）
             * 获取元素名（标签名）
             * String getText（）
             * 获取文本（开始与结束标签之间的文本信息）
             * String elementText（String name）
             * 获取当前元素下指定名字的子元素中间文本
             * String s=e.element("xxx").getText()
             * 等同于
             * String s= e.elementText（“xxx”）
             * Element element（String name）
             * 获取当前元素中指定名字的子元素
             * List elements（）
             * 获取当前元素下的所有子元素
             * List elements（String name）
             * 获取当前元素下所有给定的名字的同名子元素
             */
            Element root =doc.getRootElement();//root:<list>
            String name =root.getName();
            System.out.println("根标签："+name);
            List<Element> list =root.elements("emp");
            System.out.println(list.size());
            //遍历每一个<emp>标签来获取员工信息
            for (Element empEle : list){
                //获取员工姓名
                //通过<emp>获取子标签<name>
                Element nameEle =empEle.element("name");
                //获取<name>标签中间的文本
                String ename = nameEle.getText();
                System.out.println(ename);
               //获取年龄
                int age =Integer.parseInt(empEle.elementText("age"));
                //获取性别
                String gender =empEle.elementText("gender");
                //获取工资
                int salary =Integer.parseInt(empEle.elementText("salary"));
                //获取工号
                //通过<emp>获取属性id
                //Attribute attr =empEle.attribute("id");
                //获取id属性的值
                //int id =Integer.parseInt(attr.getValue())
                int id =Integer.parseInt(empEle.attributeValue("id"));
                System.out.println(id+","+ename+","+age+","+gender+","+salary);

            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }

    }
}
